React Hydrateã®å æ¬çã¬ã€ãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ããã€ãã¬ãŒã·ã§ã³ããªãã€ãã¬ãŒã·ã§ã³ãäžè¬çãªåé¡ã髿§èœãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ãã¹ããã©ã¯ãã£ã¹ã解説ããŸãã
React Hydrate: ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ã®ãã€ãã¬ãŒã·ã§ã³ãšãªãã€ãã¬ãŒã·ã§ã³ãè§£æãã
çŸä»£ã®ãŠã§ãéçºã®äžçã§ã¯ãé«éã§é åçãªãŠãŒã¶ãŒäœéšãæäŸããããšãæãéèŠã§ãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒã¯ãç¹ã«Reactã¢ããªã±ãŒã·ã§ã³ã«ãããŠããããéæããããã«éèŠãªåœ¹å²ãæãããŸããããããSSRã¯è€éãã䌎ããReactã® `hydrate` 颿°ãçè§£ããããšã¯ãããã©ãŒãã³ã¹ãé«ãSEOã«åŒ·ããŠã§ããµã€ããæ§ç¯ããããã®éµãšãªããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãåºæ¬çãªæŠå¿µããé«åºŠãªæé©åæè¡ãŸã§ãReact Hydrateã®è€éãªè©³çްãæãäžããŠãããŸãã
ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãšã¯ïŒ
ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ã¯ããµãŒããŒäžã§Reactã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããå®å šã«ã¬ã³ããªã³ã°ãããHTMLããã©ãŠã¶ã«éä¿¡ããããã»ã¹ã§ããããã¯ããã©ãŠã¶ãæå°éã®HTMLããŒãžãããŠã³ããŒããããã®åŸJavaScriptãå®è¡ããŠã¢ããªã±ãŒã·ã§ã³å šäœãã¬ã³ããªã³ã°ããã¯ã©ã€ã¢ã³ããµã€ãã¬ã³ããªã³ã°ïŒCSRïŒãšã¯ç°ãªããŸãã
SSRã®å©ç¹ïŒ
- SEOã®åäžïŒ æ€çŽ¢ãšã³ãžã³ã®ã¯ããŒã©ãŒãå®å šã«ã¬ã³ããªã³ã°ãããHTMLãç°¡åã«ã€ã³ããã¯ã¹ã§ãããããæ€çŽ¢ãšã³ãžã³ã©ã³ãã³ã°ãåäžããŸããããã¯ãeã³ããŒã¹ãã©ãããã©ãŒã ãããã°ã®ãããªã³ã³ãã³ãã®å€ããŠã§ããµã€ãã«ãšã£ãŠç¹ã«éèŠã§ããäŸãã°ãSSRã䜿çšããŠãããã³ãã³ãæ ç¹ãšãããã¡ãã·ã§ã³å°å£²æ¥è ã¯ãCSRã®ã¿ã䜿çšããŠããç«¶åä»ç€Ÿãããé¢é£ããæ€çŽ¢èªã§äžäœã«ã©ã³ã¯ä»ããããå¯èœæ§ãé«ããªããŸãã
- åæããŒãæéã®ççž®ïŒ ãŠãŒã¶ãŒã¯ããéãã³ã³ãã³ããèŠãããšãã§ããããããŠãŒã¶ãŒäœéšãåäžããçŽåž°çãæžå°ããŸããäŸãã°ãæ±äº¬ã®ãŠãŒã¶ãŒããŠã§ããµã€ãã«ã¢ã¯ã»ã¹ããå ŽåãSSRã䜿çšãããšãæ¥ç¶ãé ããŠãåæã³ã³ãã³ããã»ãŒç¬æã«è¡šç€ºãããŸãã
- äœã¹ããã¯ããã€ã¹ã§ã®ããã©ãŒãã³ã¹åäžïŒ ã¬ã³ããªã³ã°ããµãŒããŒã«ãªãããŒãããããšã§ããŠãŒã¶ãŒã®ããã€ã¹ã«ãããåŠçè² è·ã軜æžãããŸããããã¯ãå€ããŸãã¯æ§èœã®äœãã¢ãã€ã«ããã€ã¹ã䜿çšããŠããå°åã®ãŠãŒã¶ãŒã«ãšã£ãŠç¹ã«æçã§ãã
- ãœãŒã·ã£ã«ã¡ãã£ã¢æé©åïŒ ãœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ã§ãªã³ã¯ãå ±æããéãSSRã¯æ£ããã¡ã¿ããŒã¿ãšãã¬ãã¥ãŒç»åã衚瀺ãããããšãä¿èšŒããŸãã
SSRã®èª²é¡ïŒ
- ãµãŒããŒè² è·ã®å¢å ïŒ ãµãŒããŒäžã§ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããã«ã¯ãããå€ãã®ãµãŒããŒãªãœãŒã¹ãå¿ èŠã§ãã
- ã³ãŒãã®è€éãïŒ SSRãå®è£ ãããšãã³ãŒãããŒã¹ãããè€éã«ãªããŸãã
- éçºãšãããã€ã®ãªãŒããŒãããïŒ SSRã«ã¯ãããé«åºŠãªéçºããã³ãããã€ããã»ã¹ãå¿ èŠã§ãã
ãã€ãã¬ãŒã·ã§ã³ãšãªãã€ãã¬ãŒã·ã§ã³ã®çè§£
ãµãŒããŒãHTMLããã©ãŠã¶ã«éä¿¡ãããšãReactã¢ããªã±ãŒã·ã§ã³ã¯ã€ã³ã¿ã©ã¯ãã£ãã«ãªãå¿ èŠããããŸããããã§ãã€ãã¬ãŒã·ã§ã³ãç»å ŽããŸãããã€ãã¬ãŒã·ã§ã³ãšã¯ãã€ãã³ããªã¹ããŒãã¢ã¿ãããããµãŒããŒã§ã¬ã³ããªã³ã°ãããHTMLãã¯ã©ã€ã¢ã³ããµã€ãã§ã€ã³ã¿ã©ã¯ãã£ãã«ããããã»ã¹ã§ãã
ãã®ããã«èããŠãã ããïŒãµãŒããŒã*æ§é *ïŒHTMLïŒãæäŸãããã€ãã¬ãŒã·ã§ã³ã*æ¯ãèã*ïŒJavaScriptã®æ©èœïŒã远å ããŸãã
React Hydrateã®åœ¹å²ïŒ
- ã€ãã³ããªã¹ããŒã®ã¢ã¿ããïŒ Reactã¯ãµãŒããŒã§ã¬ã³ããªã³ã°ãããHTMLãèµ°æ»ããèŠçŽ ã«ã€ãã³ããªã¹ããŒãã¢ã¿ããããŸãã
- ä»®æ³DOMã®åæ§ç¯ïŒ Reactã¯ã¯ã©ã€ã¢ã³ããµã€ãã§ä»®æ³DOMãåäœæãããµãŒããŒã§ã¬ã³ããªã³ã°ãããHTMLãšæ¯èŒããŸãã
- DOMã®æŽæ°ïŒ ïŒäŸãã°ã¯ã©ã€ã¢ã³ããµã€ãã®ããŒã¿ãã§ããã«ããïŒä»®æ³DOMãšãµãŒããŒã§ã¬ã³ããªã³ã°ãããHTMLã®éã«äžäžèŽãããå ŽåãReactã¯ããã«å¿ããŠDOMãæŽæ°ããŸãã
HTMLã®äžèŽã®éèŠæ§
æé©ãªãã€ãã¬ãŒã·ã§ã³ã®ããã«ã¯ããµãŒããŒã«ãã£ãŠã¬ã³ããªã³ã°ãããHTMLãšãã¯ã©ã€ã¢ã³ããµã€ãã®JavaScriptã«ãã£ãŠã¬ã³ããªã³ã°ãããHTMLãåäžã§ããããšãäžå¯æ¬ ã§ããããéããããã°ãReactã¯DOMã®äžéšãåã¬ã³ããªã³ã°ããªããã°ãªããªããªããããã©ãŒãã³ã¹ã®åé¡ãèŠèŠçãªäžå ·åãåŒãèµ·ããå¯èœæ§ããããŸãã
HTMLã®äžäžèŽã®äžè¬çãªåå ã«ã¯ä»¥äžã®ãããªãã®ããããŸãïŒ
- ãµãŒããŒã§ã®ãã©ãŠã¶åºæAPIã®äœ¿çšïŒ ãµãŒããŒç°å¢ã¯ `window` ã `document` ã®ãããªãã©ãŠã¶APIã«ã¢ã¯ã»ã¹ã§ããŸããã
- äžæ£ç¢ºãªããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ïŒ ãµãŒããŒã§ãã§ãããããããŒã¿ããã¯ã©ã€ã¢ã³ãã§ãã§ãããããããŒã¿ãšç°ãªãæ¹æ³ã§ã·ãªã¢ã©ã€ãºãããå¯èœæ§ããããŸãã
- ã¿ã€ã ãŸãŒã³ã®äžäžèŽïŒ ã¿ã€ã ãŸãŒã³ã®éãã«ãããæ¥ä»ãæå»ããµãŒããŒãšã¯ã©ã€ã¢ã³ãã§ç°ãªã£ãŠã¬ã³ããªã³ã°ãããå¯èœæ§ããããŸãã
- ã¯ã©ã€ã¢ã³ããµã€ãæ å ±ã«åºã¥ãæ¡ä»¶ä»ãã¬ã³ããªã³ã°ïŒ ãã©ãŠã¶ã®ã¯ãããŒããŠãŒã¶ãŒãšãŒãžã§ã³ãã«åºã¥ããŠç°ãªãã³ã³ãã³ããã¬ã³ããªã³ã°ãããšãäžäžèŽãçããããšããããŸãã
React Hydrate API
Reactã¯ããµãŒããŒã§ã¬ã³ããªã³ã°ãããã¢ããªã±ãŒã·ã§ã³ããã€ãã¬ãŒãããããã« `hydrateRoot` APIïŒReact 18ã§å°å ¥ïŒãæäŸããŠããŸããããã¯å€ã `ReactDOM.hydrate` APIã眮ãæãããã®ã§ãã
`hydrateRoot` ã®äœ¿çšæ³ïŒ
```javascript import { createRoot } from 'react-dom/client'; import App from './App'; const container = document.getElementById('root'); const root = createRoot(container); root.hydrate(説æïŒ
- `createRoot(container)`: æå®ãããã³ã³ããèŠçŽ ïŒéåžžã¯IDã "root" ã®èŠçŽ ïŒå ã«ReactããªãŒã管çããããã®ã«ãŒããäœæããŸãã
- `root.hydrate(
)`: ã¢ããªã±ãŒã·ã§ã³ããã€ãã¬ãŒãããã€ãã³ããªã¹ããŒãã¢ã¿ããããŠãµãŒããŒã§ã¬ã³ããªã³ã°ãããHTMLãã€ã³ã¿ã©ã¯ãã£ãã«ããŸãã
`hydrateRoot` ã䜿çšããéã®äž»ãªèæ ®äºé ïŒ
- ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ãæå¹ã§ããããšã確èªããïŒ `hydrateRoot` ã¯ã`container` å ã®HTMLã³ã³ãã³ãããµãŒããŒã§ã¬ã³ããªã³ã°ãããŠããããšãæåŸ ããŸãã
- äžåºŠã ã䜿çšããïŒ ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã³ã³ããŒãã³ãã«å¯Ÿã㊠`hydrateRoot` ãäžåºŠã ãåŒã³åºããŠãã ããã
- ãã€ãã¬ãŒã·ã§ã³ãšã©ãŒãåŠçããïŒ ãã€ãã¬ãŒã·ã§ã³ããã»ã¹äžã«çºçãããšã©ãŒããã£ããããããã«ããšã©ãŒããŠã³ããªãå®è£ ããŠãã ããã
äžè¬çãªãã€ãã¬ãŒã·ã§ã³åé¡ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
ãã€ãã¬ãŒã·ã§ã³ãšã©ãŒã¯ãããã°ãå°é£ãªå ŽåããããŸããReactã¯ããµãŒããŒã§ã¬ã³ããªã³ã°ãããHTMLãšã¯ã©ã€ã¢ã³ããµã€ãã§ã¬ã³ããªã³ã°ãããHTMLã®éã«äžäžèŽãæ€åºãããšããã©ãŠã¶ã³ã³ãœãŒã«ã«èŠåã衚瀺ããŸãããããã®èŠåã«ã¯ãåé¡ãåŒãèµ·ãããŠããç¹å®ã®èŠçŽ ã«é¢ãããã³ããå«ãŸããŠããããšãå€ãã§ãã
äžè¬çãªåé¡ãšè§£æ±ºçïŒ
- ãText Content Does Not Matchããšã©ãŒïŒ
- åå ïŒ èŠçŽ ã®ããã¹ãã³ã³ãã³ãããµãŒããŒãšã¯ã©ã€ã¢ã³ãã§ç°ãªããŸãã
- 解決çïŒ
- ããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãå確èªãããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã§äžè²«ãããã©ãŒãããã䜿çšããŠããããšã確èªããŠãã ãããäŸãã°ãæ¥ä»ã衚瀺ããŠããå Žåã¯ãäž¡ãµã€ãã§åãã¿ã€ã ãŸãŒã³ãšæ¥ä»åœ¢åŒã䜿çšããŠããããšã確èªããŠãã ããã
- ããã¹ãã¬ã³ããªã³ã°ã«åœ±é¿ãäžããå¯èœæ§ã®ãããã©ãŠã¶åºæã®APIããµãŒããŒã§äœ¿çšããŠããªãããšã確èªããŠãã ããã
- ãExtra AttributesããŸãã¯ãMissing Attributesããšã©ãŒïŒ
- åå ïŒ èŠçŽ ããµãŒããŒã§ã¬ã³ããªã³ã°ãããHTMLãšæ¯èŒããŠãäœåãªå±æ§ãæã£ãŠãããã屿§ãæ¬ ããŠããŸãã
- 解決çïŒ
- ã³ã³ããŒãã³ãã®ã³ãŒããæ³šææ·±ãã¬ãã¥ãŒãããã¹ãŠã®å±æ§ããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã§æ£ããã¬ã³ããªã³ã°ãããŠããããšã確èªããŠãã ããã
- åçã«çæããã屿§ãç¹ã«ã¯ã©ã€ã¢ã³ããµã€ãã®ã¹ããŒãã«äŸåãããã®ã«æ³šæããŠãã ããã
- ãUnexpected Text Nodeããšã©ãŒïŒ
- åå ïŒ DOMããªãŒã«äºæããªãããã¹ãããŒããååšããŸããéåžžã空çœã®éããäžæ£ãªãã¹ããããèŠçŽ ãåå ã§ãã
- 解決çïŒ
- HTMLæ§é ãæ³šææ·±ãæ€æ»ããŠãäºæããªãããã¹ãããŒããç¹å®ããŠãã ããã
- ã³ã³ããŒãã³ãã®ã³ãŒããæå¹ãªHTMLããŒã¯ã¢ãããçæããŠããããšã確èªããŠãã ããã
- ã³ãŒããã©ãŒããã¿ãŒã䜿çšããŠãäžè²«ãã空çœã確ä¿ããŠãã ããã
- æ¡ä»¶ä»ãã¬ã³ããªã³ã°ã®åé¡ïŒ
- åå ïŒ ãã€ãã¬ãŒã·ã§ã³ãå®äºããåã«ãã³ã³ããŒãã³ããã¯ã©ã€ã¢ã³ããµã€ãã®æ å ±ïŒäŸïŒã¯ãããŒããŠãŒã¶ãŒãšãŒãžã§ã³ãïŒã«åºã¥ããŠç°ãªãã³ã³ãã³ããã¬ã³ããªã³ã°ããŠããŸãã
- 解決çïŒ
- åæã¬ã³ããªã³ã°äžã«ã¯ã©ã€ã¢ã³ããµã€ãã®æ å ±ã«åºã¥ãæ¡ä»¶ä»ãã¬ã³ããªã³ã°ãé¿ããŠãã ããã代ããã«ããã€ãã¬ãŒã·ã§ã³ãå®äºããã®ãåŸ ã£ãŠãããã¯ã©ã€ã¢ã³ããµã€ãã®ããŒã¿ã«åºã¥ããŠDOMãæŽæ°ããŠãã ããã
- ãããã«ã¬ã³ããªã³ã°ããšåŒã°ãããã¯ããã¯ã䜿çšããŠããµãŒããŒäžã§ãã¬ãŒã¹ãã«ããŒãã¬ã³ããªã³ã°ãããã€ãã¬ãŒã·ã§ã³åŸã«ã¯ã©ã€ã¢ã³ãã§å®éã®ã³ã³ãã³ãã«çœ®ãæããŸãã
äŸïŒã¿ã€ã ãŸãŒã³ã®äžäžèŽã®åŠç
ãŠã§ããµã€ãã§ã€ãã³ãã®æéã衚瀺ããŠããã·ããªãªãæ³åããŠã¿ãŠãã ããããµãŒããŒã¯UTCã§å®è¡ãããŠãããããããŸãããããŠãŒã¶ãŒã®ãã©ãŠã¶ã¯ç°ãªãã¿ã€ã ãŸãŒã³ã«ãããŸããæ³šæããªããšãããããã€ãã¬ãŒã·ã§ã³ãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã
äžé©åãªã¢ãããŒãïŒ
```javascript // ãã®ã³ãŒãã¯ãã€ãã¬ãŒã·ã§ã³ãšã©ãŒãåŒãèµ·ããå¯èœæ§ãé«ãã§ã function EventTime({ timestamp }) { const date = new Date(timestamp); return{date.toLocaleString()}
; } ```é©åãªã¢ãããŒãïŒ
```javascript import { useState, useEffect } from 'react'; function EventTime({ timestamp }) { const [formattedTime, setFormattedTime] = useState(null); useEffect(() => { // ã¯ã©ã€ã¢ã³ããµã€ãã§ã®ã¿æéããã©ãŒããããã const date = new Date(timestamp); setFormattedTime(date.toLocaleString()); }, [timestamp]); return{formattedTime || 'Loading...'}
; } ```説æïŒ
- `formattedTime` ã¹ããŒã㯠`null` ã§åæåãããŸãã
- `useEffect` ããã¯ã¯ãã€ãã¬ãŒã·ã§ã³åŸã«ã¯ã©ã€ã¢ã³ããµã€ãã§ã®ã¿å®è¡ãããŸãã
- `useEffect` ããã¯å ã§ãæ¥ä»ã¯ `toLocaleString()` ã䜿çšããŠãã©ãŒãããããã`formattedTime` ã¹ããŒããæŽæ°ãããŸãã
- ã¯ã©ã€ã¢ã³ããµã€ãã®ãšãã§ã¯ããå®è¡ãããŠããéããã¬ãŒã¹ãã«ããŒïŒãLoading...ãïŒã衚瀺ãããŸãã
ãªãã€ãã¬ãŒã·ã§ã³ïŒããã«æ·±ã
ããã€ãã¬ãŒã·ã§ã³ãã¯äžè¬çã«ããµãŒããŒã§ã¬ã³ããªã³ã°ãããHTMLãã€ã³ã¿ã©ã¯ãã£ãã«ããåæããã»ã¹ãæããŸãããããªãã€ãã¬ãŒã·ã§ã³ãã¯ãåæãã€ãã¬ãŒã·ã§ã³ãå®äºããåŸã®DOMãžã®åŸç¶ã®æŽæ°ãæãããšããããŸãããããã®æŽæ°ã¯ããŠãŒã¶ãŒã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãããŒã¿ãã§ããããŸãã¯ãã®ä»ã®ã€ãã³ãã«ãã£ãŠããªã¬ãŒãããå¯èœæ§ããããŸãã
ããã©ãŒãã³ã¹ã®ããã«ããã¯ãé¿ããããã«ã¯ããªãã€ãã¬ãŒã·ã§ã³ãå¹ççã«å®è¡ãããããã«ããããšãéèŠã§ãã以äžã«ããã€ãã®ãã³ãã瀺ããŸãïŒ
- äžèŠãªåã¬ã³ããªã³ã°ãæå°éã«æããïŒ Reactã®ã¡ã¢åæè¡ïŒäŸïŒ `React.memo`, `useMemo`, `useCallback`ïŒã䜿çšããŠãã³ã³ããŒãã³ããäžå¿ èŠã«åã¬ã³ããªã³ã°ãããã®ãé²ããŸãã
- ããŒã¿ãã§ããã®æé©åïŒ çŸåšã®ãã¥ãŒã«å¿ èŠãªããŒã¿ã®ã¿ããã§ããããŸããããŒãžããŒã·ã§ã³ãé å»¶èªã¿èŸŒã¿ã®ãããªæè¡ã䜿çšããŠããããã¯ãŒã¯çµç±ã§è»¢éããå¿ èŠãããããŒã¿éãæžãããŸãã
- å€§èŠæš¡ãªãªã¹ãã«ã¯ä»®æ³åã䜿çšããïŒ å€§èŠæš¡ãªããŒã¿ãªã¹ããã¬ã³ããªã³ã°ããå Žåãä»®æ³åæè¡ã䜿çšããŠè¡šç€ºãããŠããã¢ã€ãã ã®ã¿ãã¬ã³ããªã³ã°ããŸããããã«ãããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ãªã³ã°ïŒ Reactã®ãããã¡ã€ã©ã䜿çšããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«å¿ããŠã³ãŒããæé©åããŸãã
ãã€ãã¬ãŒã·ã§ã³ãæé©åããããã®é«åºŠãªãã¯ããã¯
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®éšåã®ã¿ãéžæçã«ãã€ãã¬ãŒãããä»ã®éšåã®ãã€ãã¬ãŒã·ã§ã³ãåŸåãã«ããããšãã§ããŸããããã¯ãããã«ã¯è¡šç€ºãããªãããŸãã¯ã€ã³ã¿ã©ã¯ãã£ãã§ãªãã³ã³ããŒãã³ããããå Žåã«ãã¢ããªã±ãŒã·ã§ã³ã®åæããŒãæéãæ¹åããã®ã«åœ¹ç«ã¡ãŸãã
Reactã¯ãã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ãæ¯æŽããããã« `useDeferredValue` ããã³ `useTransition` ããã¯ïŒReact 18ã§å°å ¥ïŒãæäŸããŠããŸãããããã®ããã¯ã«ãããç¹å®ã®æŽæ°ãä»ã®æŽæ°ãããåªå ãããããšãã§ããã¢ããªã±ãŒã·ã§ã³ã®æãéèŠãªéšåãæåã«ãã€ãã¬ãŒããããããã«ããŸãã
ã¹ããªãŒãã³ã°SSR
ã¹ããªãŒãã³ã°SSRã¯ãããŒãžå šäœãã¬ã³ããªã³ã°ãããã®ãåŸ ã€ã®ã§ã¯ãªãããµãŒããŒã§å©çšå¯èœã«ãªã£ãHTMLã®äžéšããã©ãŠã¶ã«éä¿¡ãããã®ã§ããããã«ãããTime to First ByteïŒTTFBïŒãšäœæããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
Next.jsã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯ãã¹ããªãŒãã³ã°SSRãæšæºã§ãµããŒãããŠããŸãã
ããŒã·ã£ã«ãã€ãã¬ãŒã·ã§ã³ïŒå®éšçïŒ
ããŒã·ã£ã«ãã€ãã¬ãŒã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¿ã©ã¯ãã£ããªéšåã®ã¿ããã€ãã¬ãŒãããéçãªéšåã¯ãã€ãã¬ãŒãããªããŸãŸã«ããå®éšçãªæè¡ã§ããããã«ãããã¯ã©ã€ã¢ã³ããµã€ãã§å®è¡ããå¿ èŠãããJavaScriptã®éãå€§å¹ ã«åæžãããããã©ãŒãã³ã¹ãåäžããŸãã
ããŒã·ã£ã«ãã€ãã¬ãŒã·ã§ã³ã¯ãŸã å®éšçãªæ©èœã§ããããŸã åºããµããŒããããŠããŸããã
SSRãšãã€ãã¬ãŒã·ã§ã³ãç°¡çŽ åãããã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãª
ããã€ãã®ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã¯ãReactã¢ããªã±ãŒã·ã§ã³ã§ã®SSRãšãã€ãã¬ãŒã·ã§ã³ã®å®è£ ã容æã«ããŸãïŒ
- Next.jsïŒ SSRãéçãµã€ãçæïŒSSGïŒãAPIã«ãŒããçµã¿èŸŒã¿ã§ãµããŒããã人æ°ã®Reactãã¬ãŒã ã¯ãŒã¯ã§ãããã«ãªã³ã®å°èŠæš¡ãªã¹ã¿ãŒãã¢ããããã·ãªã³ã³ãã¬ãŒã®å€§äŒæ¥ãŸã§ãäžçäžã®äŒæ¥ã§åºã䜿çšãããŠããŸãã
- GatsbyïŒ Reactã䜿çšããéçãµã€ããžã§ãã¬ãŒã¿ãŒã§ããGatsbyã¯ãã³ã³ãã³ãã®å€ããŠã§ããµã€ããããã°ã®æ§ç¯ã«é©ããŠããŸãã
- RemixïŒ ãŠã§ãæšæºãšããã©ãŒãã³ã¹ã«çŠç¹ãåœãŠããã«ã¹ã¿ãã¯ã®ãŠã§ããã¬ãŒã ã¯ãŒã¯ã§ããRemixã¯ãSSRãšããŒã¿ããŒãã£ã³ã°ãçµã¿èŸŒã¿ã§ãµããŒãããŠããŸãã
ã°ããŒãã«ãªæèã«ãããSSRãšãã€ãã¬ãŒã·ã§ã³
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã«ã¯ã以äžã®ç¹ãèæ ®ããããšãäžå¯æ¬ ã§ãïŒ
- ããŒã«ãªãŒãŒã·ã§ã³ãšåœéåïŒi18nïŒïŒ ã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®èšèªãšå°åããµããŒãããŠããããšã確èªããŠãã ããã翻蚳ãšããŒã«ãªãŒãŒã·ã§ã³ãåŠçããããã« `i18next` ã®ãããªã©ã€ãã©ãªã䜿çšããŸãã
- ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒïŒ CDNã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã»ãããäžçäžã®ãµãŒããŒã«é ä¿¡ããŸããããã«ãããç°ãªãå°ççãªå Žæã«ãããŠãŒã¶ãŒã«ãšã£ãŠã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžããŸããå°èŠæš¡ãªCDNãããã€ããŒã§ã¯ãµãŒãã¹ãæèã«ãªããã¡ãªåç±³ãã¢ããªã«ã®ãããªå°åã«ãæ ç¹ãæã€CDNãæ€èšããŠãã ããã
- ãã£ãã·ã³ã°ïŒ ãµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã§ãã£ãã·ã³ã°æŠç¥ãå®è£ ããŠããµãŒããŒã®è² è·ã軜æžããããã©ãŒãã³ã¹ãåäžãããŸãã
- ããã©ãŒãã³ã¹ã¢ãã¿ãªã³ã°ïŒ ããã©ãŒãã³ã¹ã¢ãã¿ãªã³ã°ããŒã«ã䜿çšããŠãããŸããŸãªå°åã§ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã远跡ããæ¹åã®äœå°ãããé åãç¹å®ããŸãã
çµè«
React Hydrateã¯ããµãŒããŒãµã€ãã¬ã³ããªã³ã°ã䜿çšããŠããã©ãŒãã³ã¹ãé«ãSEOã«åŒ·ãReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®éèŠãªèŠçŽ ã§ãããã€ãã¬ãŒã·ã§ã³ã®åºæ¬ãçè§£ããäžè¬çãªåé¡ããã©ãã«ã·ã¥ãŒãã£ã³ã°ããé«åºŠãªæé©åæè¡ã掻çšããããšã§ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«åªãããŠãŒã¶ãŒäœéšãæäŸã§ããŸããSSRãšãã€ãã¬ãŒã·ã§ã³ã¯è€éããå¢ããŸãããSEOãããã©ãŒãã³ã¹ããŠãŒã¶ãŒäœéšã®é¢ã§æäŸãããå©ç¹ã¯ãå€ãã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠäŸ¡å€ã®ããæè³ãšãªããŸãã
React Hydrateã®åãæŽ»çšããŠãé«éã§é åçããããŠäžçäžã®ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ãããŠã§ãã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããããµãŒããŒãšã¯ã©ã€ã¢ã³ãéã®æ£ç¢ºãªHTMLã®äžèŽãåªå ããæé©åã®é åãç¹å®ããããã«ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãç¶ç¶çã«ç£èŠããããšãå¿ããªãã§ãã ããã